cormoran.me



SDL2の使い方 ②色々描く

前回の続きです。今回はSDL2のライブラリにある図形を描写する簡単なサンプルです。備忘録。

背景色を変える & 直線描写

まずは直線だけの例。どのページからとってきたか忘れましたがSDL Wiki内のサンプルコードの改変です。

描写はRendererのキャンバスに色々書き込んでいってそれをWindowに転写するイメージだと思います。

language: ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 //environment : gcc4.9 c++ #include "SDL2/SDL.h" int main() { SDL_Init(SDL_INIT_VIDEO); SDL_Window* window = SDL_CreateWindow("Draw Test",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,640,480,0); SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0); SDL_Event ev; while(true){ //描写色を変える //R,G,B,A) //注:AはSDL_SetRenderDrawBlendModeの設定をしないと無効 SDL_SetRenderDrawColor(renderer, 0, 255, 200, 255); //ウィンドウを現在の色で塗りつぶす つまり消去 SDL_RenderClear(renderer); //ウィンドウなどのイベント処理 //ifにするとeventがキューにどんどん溜まってしまって反応が遅くなる? //whileでもMacだと固まることがあってよく分からない while (SDL_PollEvent(&ev)) { if (ev.type == SDL_QUIT) { break; } } //描写する色を切り替える SDL_SetRenderDrawColor(renderer, 200, 150, 150, 255); //直線を描く //x1,y1,x2,y2の順 SDL_RenderDrawLine(renderer,10, 10, 50, 50); //windowにレンダリングする SDL_RenderPresent(renderer); } //解放処理 SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 0; }

色々描写する

SDLには円を描写する関数がないみたいです。点、直線、長方形を描写する関数があります。一通り使ってみました。

SDL2_GFXを使うと円などを書く関数も使えるようです。

language: ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 //environment : gcc4.9 c++ #include "SDL2/SDL.h" int main(int, char ** const) { SDL_Init(SDL_INIT_VIDEO); SDL_Window* window = SDL_CreateWindow("Draw Test",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,640,480,0); SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0); SDL_Event ev; while(true){ //描写色を変える //R,G,B,A) //AはDrawBlendModeの設定が必要らしい SDL_SetRenderDrawColor(renderer, 0, 255, 200, 255); //ウィンドウを現在の色で塗りつぶす SDL_RenderClear(renderer); while (SDL_PollEvent(&ev)) { if (ev.type == SDL_QUIT) { break; } } //描写色切り替え SDL_SetRenderDrawColor(renderer, 200, 150, 150, 255); //直線を描く //x1,y1,x2,y2 SDL_RenderDrawLine(renderer,10, 10, 50, 50); for(int x=60;x<=100;x+=2){ for(int y=10;y<=50;y+=2){ //点を描く SDL_RenderDrawPoint(renderer,x,y); } } //下の長方形の例のように配列でやることも可能 //長方形(枠だけ)を描く SDL_Rect rect1; rect1.x=110;rect1.y=10;rect1.w=100;rect1.h=100; SDL_RenderDrawRect(renderer, &rect1); //長方形(塗りつぶし)を描く SDL_Rect rect2=(SDL_Rect){220,10,100,100}; SDL_RenderFillRect(renderer,&rect2); //長方形を配列を使ってまとめて描く SDL_Rect rects[20]; for(int i=0;i<20;i++){ rects[i]=(SDL_Rect){10+i*20,150,10,10}; } SDL_RenderDrawRects(renderer, rects,20); //windowにレンダリングする SDL_RenderPresent(renderer); } SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 0; }